﻿namespace Trancity
{
    using Common;
    using Microsoft.DirectX;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Drawing;

    public class Контактный_провод : MeshObject, MeshObject.IFromFile, IMatrixObject, IObjectContainer
    {
        private ArrayList fобъекты = new ArrayList();
        public double[] высота = new double[2];
        public DoublePoint конец;
        public DoublePoint начало;
        public bool обесточенный;
        public bool правый;
        public Контактный_провод[] предыдущие_провода = new Контактный_провод[0];
        public static double расстояние_между_проводами = 0.65;
        public Контактный_провод[] следующие_провода = new Контактный_провод[0];

        public Контактный_провод(double начало_x, double начало_y, double конец_x, double конец_y, bool правый)
        {
            this.начало = new DoublePoint(начало_x, начало_y);
            this.конец = new DoublePoint(конец_x, конец_y);
            this.правый = правый;
        }

        public Matrix GetMatrix(int index)
        {
            double num = !MyDirect3D.вид_сверху ? 0.3 : 1.0;
            if (MyDirect3D.карта)
            {
                num *= 10.0;
            }
            DoublePoint point = this.конец - this.начало;
            double num2 = point.модуль;
            DoublePoint point2 = this.конец - this.начало;
            double num3 = point2.угол;
            double num4 = this.высота[0] + высота_контактной_сети;
            float y = ((float) num) / 2f;
            Matrix matrix = new Matrix();
            matrix.M11 = 1f;
            matrix.M12 = ((float) (this.высота[1] - this.высота[0])) / y;
            matrix.M22 = 1f;
            matrix.M33 = 1f;
            matrix.M44 = 1f;
            return (((matrix * Matrix.Scaling((float) num2, y, (float) num)) * Matrix.RotationY(-((float) num3))) * Matrix.Translation((float) this.начало.x, (float) num4, (float) this.начало.y));
        }

        public double найти_высоту(double расстояние)
        {
            return (this.высота[0] + (((this.высота[1] - this.высота[0]) * расстояние) / this.длина));
        }

        public DoublePoint найти_координаты(double расстояние, double отклонение)
        {
            DoublePoint point = new DoublePoint(0.0, 0.0);
            double num = расстояние / this.длина;
            DoublePoint point2 = this.конец - this.начало;
            point = this.начало + ((DoublePoint) (point2 * num));
            point2.угол += 1.5707963267948966;
            point2.модуль = отклонение;
            return (point + point2);
        }

        public void обновить_следующие_провода(Контактный_провод[] провода)
        {
            List<Контактный_провод> list = new List<Контактный_провод>();
            List<Контактный_провод> list2 = new List<Контактный_провод>();
            foreach (Контактный_провод _провод in провода)
            {
                DoublePoint point4;
                if (_провод == this)
                {
                    goto Label_011C;
                }
                DoublePoint point = _провод.начало - this.конец;
                if (point.модуль < 0.01)
                {
                    if (list.Count > 0)
                    {
                        DoublePoint point2 = new DoublePoint(_провод.направление - this.направление);
                        DoublePoint point3 = new DoublePoint(list[0].направление - this.направление);
                        if (point2.угол > point3.угол)
                        {
                            list.Insert(0, _провод);
                            goto Label_009F;
                        }
                    }
                    list.Add(_провод);
                }
            Label_009F:
                point4 = _провод.конец - this.начало;
                if (point4.модуль < 0.01)
                {
                    if (list2.Count > 0)
                    {
                        DoublePoint point5 = new DoublePoint(_провод.направление - this.направление);
                        DoublePoint point6 = new DoublePoint(list2[0].направление - this.направление);
                        if (point5.угол > point6.угол)
                        {
                            list2.Insert(0, _провод);
                            goto Label_011C;
                        }
                    }
                    list2.Add(_провод);
                }
            Label_011C:;
            }
            this.следующие_провода = list.ToArray();
            this.предыдущие_провода = list2.ToArray();
        }

        public int color
        {
            get
            {
                if ((base._meshMaterials != null) && (base._meshMaterials.Length > 0))
                {
                    return base._meshMaterials[0].Diffuse.ToArgb();
                }
                return 0;
            }
            set
            {
                if ((base._meshMaterials != null) && (base._meshMaterials.Length > 0))
                {
                    base._meshMaterials[0].Diffuse = Color.FromArgb(value | -16777216);
                    base._meshMaterials[0].Ambient = Color.FromArgb(value | -16777216);
                }
            }
        }

        public string Filename
        {
            get
            {
                return "провод.x";
            }
        }

        public int MatricesCount
        {
            get
            {
                if (!MyDirect3D.карта)
                {
                    DoublePoint point = this.найти_координаты(0.0, 0.0);
                    DoublePoint point2 = this.найти_координаты(this.длина, 0.0);
                    DoublePoint point3 = new DoublePoint(point.x - MyDirect3D.Camera_Position.x, point.y - MyDirect3D.Camera_Position.z);
                    if (point3.модуль > (250.0 + this.длина))
                    {
                        DoublePoint point4 = new DoublePoint(point2.x - MyDirect3D.Camera_Position.x, point2.y - MyDirect3D.Camera_Position.z);
                        if (point4.модуль > (250.0 + this.длина))
                        {
                            return 0;
                        }
                    }
                }
                return 1;
            }
        }

        public static double высота_контактной_сети
        {
            get
            {
                return Рельс.высота_контактной_сети;
            }
        }

        public double длина
        {
            get
            {
                DoublePoint point = this.конец - this.начало;
                return point.модуль;
            }
        }

        public double направление
        {
            get
            {
                DoublePoint point = this.конец - this.начало;
                return point.угол;
            }
        }

        public ArrayList objects
        {
            get
            {
                return this.fобъекты;
            }
        }
    }
}

